home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 9 / The PC-SIG Library on CD ROM - Ninth Edition.iso / 501_600 / DISK0579 / DISK0579.ZIP / CHAP15.TXT < prev    next >
Text File  |  1989-12-01  |  30KB  |  709 lines

  1.  
  2.  
  3.  
  4.                                                    Chapter 15
  5.                                   ENCAPSULATION & INHERITANCE
  6.  
  7.  
  8. Encapsulation is the cornerstone upon which object oriented
  9. programming is built, and without which it would not exist. 
  10. We will cover the topic of encapsulation in this chapter in
  11. enough depth to illustrate its use and what it can do for you
  12. in software development.  Because there are many new terms in
  13. this chapter, you could very easily become intimidated, and
  14. wish to simply give up on this new topic.  You can be assured
  15. that the time spent studying encapsulation will be greatly
  16. rewarded as you apply this new technique in your software
  17. development efforts.
  18.  
  19. Object oriented programming is not a panacea to solve all of
  20. your software problems, but it is a new and improved way of
  21. programming.  In fact it is really more of a software
  22. packaging technology than a new method of programming.  You
  23. will find that your software will be easier to write and debug
  24. as you gain experience using this new packaging method.  Like
  25. any new endeavor however, it will require some effort on your
  26. part to master these concepts.
  27.  
  28.  
  29. OUR FIRST ENCAPSULATION
  30. ____________________________________________________________
  31.  
  32. The example program named ENCAP1.PAS contains  ==============
  33. our first example of encapsulation.  In order    ENCAP1.PAS
  34. to keep it easy to understand, it was kept     ==============
  35. very short.  This results in a program that
  36. does not illustrate the advantage of using
  37. object oriented programming, but it does give us a start in
  38. the right direction.  With this in mind, load ENCAP1.PAS and
  39. we will study the code contained in it.
  40.  
  41. Line 5 has our first new reserved word, object.  This is used
  42. in much the same way that the reserved word record is used,
  43. but it has a much different meaning.  An object is permitted
  44. to have not only data embedded within it, but also procedures,
  45. functions, and constructors.  Constructors will be described
  46. in detail later.  Since data plus procedures and functions can
  47. be grouped together in this fashion, the object is said to be
  48. encapsulated.  An object is therefore a group of related data
  49. and the subprograms that operate on that data, all entities
  50. being very closely coupled together.
  51.  
  52.  
  53. WHAT IS A METHOD?
  54. ____________________________________________________________
  55.  
  56. A method is a term used with object oriented programming, and
  57. for the time being we will simply say that a method is either
  58.  
  59.                                                     Page 15-1
  60.  
  61.                                 Encapsulation and Inheritance
  62.  
  63. a function or a procedure (including a constructor).  A method
  64. is therefore a method for doing an operation on some data. 
  65. Lines 8 through 10 are method headers and give the pattern for
  66. all calls to these methods which can be used by the compiler
  67. to check for the correct number and types of parameters.
  68.  
  69. Once again, we promise to discuss the constructor soon.  For
  70. the time being, simply think of it as another procedure.
  71.  
  72. The entire object type definition is given in lines 5 through
  73. 11.  This object contains two variables named length and
  74. width, each of type integer, and three methods which can be
  75. used to operate on the two variables.  In the same manner that
  76. the definition of a type in Pascal does not actually give you
  77. a variable to use, only a pattern, the definition of an object
  78. type does not give you an object.  We will declare the objects
  79. when we get to line 30 of this program.
  80.  
  81. You will note that we are already using new terminology, but
  82. this is necessary.  The field of object oriented programming
  83. has its own vocabulary and in order for you to understand
  84. technical articles in this field, you must begin now to learn
  85. the new terminology.  It won't be too long until you feel
  86. somewhat comfortable with it.
  87.  
  88.  
  89.  
  90. THE METHOD IMPLEMENTATION
  91. ____________________________________________________________
  92.  
  93. The object type definition describes in detail what we can do
  94. with the object but we must now describe what actions will
  95. take place when each of the methods is called.  The
  96. implementation for each method will define the operations for
  97. that method and are defined in lines 13 through 28 of this
  98. example program.  The only thing that is really different
  99. about these methods is the way their headers are defined,
  100. namely the inclusion, in the header, of the object type name
  101. Box dotted to the method name.  This is required, but we will
  102. wait until the next example program to define why it is
  103. needed.
  104.  
  105. The observant student will also notice that we are referring
  106. to the object variables within the methods of that object
  107. without the object name dotted to the variable name.  This is
  108. because the implied object name is automatically "with"ed to
  109. the variable names within the method implementations, allowing
  110. the variables to be directly referred to within the objects
  111. because of the definition of object oriented programming.  It
  112. should be obvious that any mathematics or logical operations
  113. can be done within the implementations of the methods.  In
  114. fact, you can perform any legal Pascal operations within the
  115. methods, just like you can in any Pascal function or
  116. procedure.  Very short operations were selected here because
  117.  
  118.                                                     Page 15-2
  119.  
  120.                                 Encapsulation and Inheritance
  121.  
  122. we wish to illustrate the interfaces to the methods at this
  123. point in the tutorial.
  124.  
  125.  
  126. AN INSTANCE OF AN OBJECT
  127. ____________________________________________________________
  128.  
  129. We need another new term at this point.  When we use the
  130. object type to declare variables of that type as we do in line
  131. 30, we are creating instances of that object type.  An
  132. instance is like a variable in conventional Pascal (non object
  133. oriented), except that it can do more and has some very
  134. interesting properties that a simple variable does not have. 
  135. In line 30 we have created three instances of the object type
  136. named Box and each has two simple variables associated with
  137. it.  Three methods are available which can be called to
  138. operate on these variables.  We therefore have three objects
  139. named Small, Medium, and Large.  In order to initialize the
  140. values stored within the objects we call the three objects in
  141. lines 34 through 36 to store values in their internal
  142. variables by dotting the name of the object to the name of the
  143. method we wish to call.  You will note that this looks like
  144. the same technique we use to refer to the fields of a record.
  145.  
  146. We display the area of the three boxes in lines 38 through 40
  147. using the same technique used to initialize the values stored,
  148. and the program is complete.
  149.  
  150. We seem to have accomplished very little with this program
  151. that we could not have more easily accomplished with an even
  152. shorter standard Pascal program, and that is true. This
  153. program is only meant to introduce some of the mechanics of
  154. object oriented programming and additional programs will be
  155. used to illustrate some of the uses of this new technique.
  156.  
  157.  
  158.  
  159. NEW TERMINOLOGY
  160. ____________________________________________________________
  161.  
  162. You may note that we switched terminology halfway through the
  163. above paragraphs.  We began by referring to the object types
  164. as object types and calling the variables declared in line 30
  165. instances.  Later we began calling the instances objects.  In
  166. this tutorial we will refer to the types as object types and
  167. the variables either as objects or instances.  This
  168. terminology is consistent with current practice and should
  169. help you learn the new terminology.
  170.  
  171. Another very important point is the fact that we pass a
  172. message to a method rather than call a subprogram as in
  173. conventional Pascal.  The difference is rather subtle, but
  174. there really is a difference as we will see a little later in
  175. this tutorial.
  176.  
  177.                                                     Page 15-3
  178.  
  179.                                 Encapsulation and Inheritance
  180.  
  181.  
  182. WHAT DID WE ACCOMPLISH?
  183. ____________________________________________________________
  184.  
  185. In this program we defined an object type, then declared
  186. several instances of that type, one of which was named Small. 
  187. The object named Small has two internal variables that should
  188. only be accessed via its methods, so we will refer to them as
  189. private data points.  (Actually, they should be unavailable
  190. to any user outside of the method implementations but Borland
  191. chose not to make them private.  It is therefore up to you to
  192. discipline yourself to not refer to them directly.)  The
  193. proper way to use the object is to send a message to the
  194. object telling it to do something to itself.  In the case of
  195. the Init method, we are telling it to store the two values in
  196. its private variables named length and width, and in the case
  197. of the Get_Area method, we are telling it to give us the
  198. product of its own internally stored width and length which
  199. we can then print out.
  200.  
  201. Remember that in the beginning of this chapter we said that
  202. object oriented programming is a code packaging technique. 
  203. That should help to explain some of the strange things we did
  204. in this program.  As we continue through the example programs,
  205. we will see that everything here was done for a reason and you
  206. will eventually learn to use and prefer object oriented
  207. programming methods over the old familiar procedural
  208. programming method you have been using.
  209.  
  210. Be sure to compile and execute this program to see if it does
  211. what the comments say it will do.
  212.  
  213.  
  214.  
  215. DATA & CODE PROTECTION
  216. ____________________________________________________________
  217.  
  218. The data and methods are protected from outside influence
  219. because they are packaged together with an object.  Of even
  220. more importance is the fact that because they were to be
  221. packaged together, they were probably carefully thought out
  222. together during the design stage.  This would probably result
  223. in a much more understandable program.  The object keeps the
  224. data and methods together and keeps them working in close
  225. synchronization.
  226.  
  227. An object type is sometimes referred to as an abstract data
  228. type in the technical literature discussing object oriented
  229. programming.
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.                                                     Page 15-4
  237.  
  238.                                 Encapsulation and Inheritance
  239.  
  240. MORE ENCAPSULATION
  241. ____________________________________________________________
  242.  
  243. The example program named ENCAP2.PAS uses    ================
  244. most of the same techniques as the last         ENCAP2.PAS
  245. program but this is much more meaningful     ================
  246. since it illustrates one of the simplest
  247. advantages of using object oriented
  248. programming.
  249.  
  250. In this program, we define two object types in lines 5 through
  251. 19, Box and Pole.  Each has its own unique kinds of variables
  252. associated with it, and each has three methods that can be
  253. used with these kinds of data.  The method definitions in
  254. lines 33 and 44 clearly illustrate why the object name must
  255. be associated with the method name in the method
  256. implementation.  This allows you to use the same method name
  257. in more than one object definition.  In addition to the two
  258. method definitions named Set_Data given here, we could also
  259. define and use another procedure with the name Set_Data that
  260. was a normal Pascal procedure just like any others we have
  261. used in prior chapters of this tutorial.  Using the same
  262. method name in several places is often referred to as name
  263. overloading in object oriented programming terminology.
  264.  
  265. You will note that in lines 5 through 19 we define the object
  266. types which define what the object will do.  In lines 21
  267. through 53 we define the method implementations which define
  268. how we do it.  It is assumed that you know enough Pascal at
  269. this point to understand what each method does, so nothing
  270. more will be said about the details of this program.
  271.  
  272. In lines 55 and 56, we declare several objects of the defined
  273. object types and use some of them in the main program.  We can
  274. finally illustrate one of the biggest advantages of object
  275. oriented programming.
  276.  
  277. We should all agree that it would be silly and meaningless to
  278. multiply the height of one of the poles by the width of a box. 
  279. If we were using standard procedural programming with all
  280. variables defined globally, it would be a simple matter to
  281. accidentally write height*width and print out the result
  282. thinking we had a meaningful answer.  By encapsulating the
  283. data within the objects, we would have to really work at it
  284. to get that meaningless answer because the system itself would
  285. prevent us from accidentally using the wrong data.  This is
  286. true only if we have agreed not to use any of the data
  287. directly but to do all data access through the available
  288. methods.
  289.  
  290. Encapsulation is a form of information hiding, but it is a
  291. rather weak form of it in TURBO Pascal because, as mentioned
  292. earlier, Borland chose not to make the variables within the
  293. object private.  If the variables were defined as private
  294.  
  295.                                                     Page 15-5
  296.  
  297.                                 Encapsulation and Inheritance
  298.  
  299. variables, they would be unaccessible outside of the
  300. implementation for the object and the client would be forced
  301. to use only the methods provided by the author of the object
  302. to access the contained data.  This would be true information
  303. hiding and would add some degree of protection to the internal
  304. data.  It is up to you to never refer to the data within the
  305. object directly as stated by Borland in the OOP GUIDE included
  306. with the compiler.
  307.  
  308. The careful student will notice that since all data is
  309. carefully tied up within the objects, inadvertent mixing of
  310. the wrong data is impossible provided a few simple rules are
  311. followed as discussed above.  Once again, this is such a small
  312. program that it is difficult to see the advantage of going to
  313. all of this trouble.  In a larger program, once the objects
  314. are completed, it is a simple matter to use them knowing that
  315. they are debugged and working.
  316.  
  317. After the data are all printed out, some of the variables are
  318. changed in lines 78 through 80, and the same output statements
  319. are used to reprint the same data so you can observe the
  320. changes.
  321.  
  322.  
  323.  
  324. A FEW RULES ARE NEEDED
  325. ____________________________________________________________
  326.  
  327. As with any new topic, there are a few rules we must follow
  328. to use this new technique.  The variables must all be declared
  329. first in the object followed by the method definitions.  The
  330. names of all variables within an object must be unique and
  331. may not be repeated as the names of any of the formal
  332. variables in any of the methods.  Thus length, width, len, and
  333. wid must be unique as used in lines 6, 7, and 8.  The names
  334. of formal variables may be reused in other methods however,
  335. as illustrated in lines 8 and 9, and all names may be reused
  336. in another object.  It should be obvious that all object type
  337. names must be unique within a given file and all objects must
  338. have unique names.
  339.  
  340. All of the above rules are obvious if you spend a little time
  341. thinking about them.  They should therefore not be a stumbling
  342. block to anyone with some procedural programming experience.
  343.  
  344.  
  345.  
  346. WHAT IS A CONSTRUCTOR?
  347. ____________________________________________________________
  348.  
  349. It is time to keep our promise and define just what a
  350. constructor is.  In this present context, that of simple
  351. objects, the constructor does very little for us, but we will
  352. include one for nearly every object to illustrate its use.
  353.  
  354.                                                     Page 15-6
  355.  
  356.                                 Encapsulation and Inheritance
  357.  
  358. The constructor can be named anything desired but it would be
  359. best to stick with the convention and name every constructor
  360. Init as suggested by Borland.  The constructor is used to
  361. initialize all values within an object and do any other setup
  362. that must be done to use an object.  The constructor should
  363. be called once for every declared object.  When we get to the
  364. topic of virtual functions, constructors will be absolutely
  365. required for every object, but for the simple objects we are
  366. using here, they are optional.
  367.  
  368. It would be best to include a constructor in every object
  369. type, use the constructor to initialize all variables within
  370. the object, and call the constructor once for each instance
  371. of the object type.  Until we get to virtual methods, none of
  372. this is required, but it would be good practice to get in the
  373. habit of doing it.
  374.  
  375.  
  376.  
  377. WHAT IS A DESTRUCTOR?
  378. ____________________________________________________________
  379.  
  380. A destructor is another method that can be used for cleanup
  381. when you are finished with an object.  It is usually used in
  382. conjunction with dynamic allocation to assure that all
  383. dynamically allocated fields associated with the object are
  384. deallocated prior to leaving the scope of the object.  A
  385. destructor is not illustrated in this tutorial but it should
  386. be easy for you to define and use one when you have a need for
  387. one.
  388.  
  389.  
  390.  
  391. OUR FIRST INHERITANCE
  392. ____________________________________________________________
  393.  
  394. Load the example program named INHERIT1.PAS  ================
  395. for our first example of a program with        INHERIT1.PAS
  396. inheritance.  As always, our first encounter ================
  397. with this new topic will be very simple.
  398.  
  399. In lines 7 through 14 we define a simple object type defining
  400. a vehicle and a few characteristics about the vehicle.  We
  401. have the ability to store a few values and read them out in
  402. several ways.  Of course, most of the interest is in the
  403. interfaces, so the implementations are purposely kept very
  404. small.
  405.  
  406. In lines 17 through 35, we declare two additional object types
  407. that use the Vehicle type as a base for the new types as
  408. indicated by the previously defined name Vehicle in
  409. parentheses in the object definitions in lines 17 and 26.  The
  410. Vehicle object is said to be the ancestor type and the two new
  411. object types are called descendant types.  The descendant
  412.  
  413.                                                     Page 15-7
  414.  
  415.                                 Encapsulation and Inheritance
  416.  
  417. types inherit some information from the ancestor types
  418. according to well defined rules.  The variables in the
  419. ancestor type are all included within the descendant types and
  420. are available in objects of the descendant types just as if
  421. they had been defined within the descendant types.  For that
  422. reason, all variable names must be unique within the ancestor
  423. type and within each of the descendant types.  A name can be
  424. reused in one or more descendants however, as is illustrated
  425. in lines 18 and 27 where the variable name Passenger_Load is
  426. used in both object types.
  427.  
  428. The method names from the ancestor object types can be
  429. repeated in the descendant object types but this has the
  430. effect of overriding the method of the same name in the
  431. ancestor making the ancestor method unavailable for use in
  432. objects of the descendant types.  Objects instantiated of the
  433. type Car therefore, have the three methods available in lines
  434. 11 through 13 of the ancestor type, the constructor in line
  435. 19 which overrides the constructor in line 10 of the ancestor
  436. type, and the function given in line 22.  This object
  437. therefore has five different methods to perform its required
  438. operations.
  439.  
  440. Objects of type Truck have five methods available also, the
  441. two in lines 11 and 12 and the one in line 33.  The two in
  442. lines 29 and 34 of the descendant overrides the two in lines
  443. 10 and 13 of the ancestor object type.
  444.  
  445. You should note that even though some of the methods were
  446. overridden in the descendant object type, they do not affect
  447. the ancestor, and instances of the Vehicle type have two
  448. variables and four methods available.
  449.  
  450. In effect we have an object hierarchy which can be extended
  451. to as many levels as necessary to complete the task at hand. 
  452. The most important part of object oriented programming is the
  453. definition of the objects in a meaningful manner, but it is
  454. not something you will learn to do overnight.  It will take
  455. a great deal of practice until you can see the objects in any
  456. given project in such a way that a clear solution can be
  457. found.  I was somewhat intimidated by the clever examples
  458. found in a classic text on object oriented programming until
  459. I talked to a man that had shared an office with the author
  460. at the time he was writing that particular book.  I learned
  461. that what was finally put in the book was at least the fourth
  462. iteration of each problem and in some cases the seventh before
  463. he finally arrived at a good solution.  We will have more to
  464. say about this as we progress through this tutorial.
  465.  
  466.  
  467.  
  468.  
  469.  
  470.  
  471.  
  472.                                                     Page 15-8
  473.  
  474.                                 Encapsulation and Inheritance
  475.  
  476. HOW DO WE USE THE OBJECTS?
  477. ____________________________________________________________
  478.  
  479. The implementations of the methods are given in lines 39
  480. through 92 and should be self explanatory, except for a few
  481. notable exceptions.  You will note that in line 81 we send a
  482. message to the Vehicle.Init method to initialize some data. 
  483. A change to the Vehicle type will be reflected in the Truck
  484. type also because of this call.  In lines 64 and 65 we are
  485. using some inherited variables just as if they had been
  486. defined as part of the descendant object types.
  487.  
  488. In lines 96 through 98 we instantiate one of each and send a
  489. message to their constructors in lines 102 through 104 then
  490. print out a few of the stored values.
  491.  
  492. Lines 113 through 116 are repeated in lines 120 through 123
  493. where they are placed within a with section to illustrate that
  494. the with can be used for the calls to the methods in the same
  495. manner that it is used for accessing the fields of a record. 
  496. Any other details of this program can be gleaned by the
  497. diligent student.  Be sure to compile and execute this program
  498. so you can verify the given result.
  499.  
  500.  
  501.  
  502. AN OBJECT IN A UNIT
  503. ____________________________________________________________
  504.  
  505. Load the example program named VEHICLES.PAS  ================
  506. for an example of the proper way to package    VEHICLES.PAS
  507. the object so it can be conveniently reused  ================
  508. for another project.
  509.  
  510. The object type definition is given in the public part of the
  511. unit so it is available to any Pascal program which needs to
  512. use it.  The implementation of the methods are hidden in the
  513. implementation part of the unit where they are not directly
  514. available to any calling program.  Note that it is also
  515. possible to define a few local methods within the
  516. implementation for use only within the implementation but none
  517. are illustrated here.  There is no body to this unit, only the
  518. end statement in line 39 so there is no initialization code
  519. to be executed during loading.  It would be perfectly legal
  520. to include an initialization body, but if you do, be sure to
  521. include a constructor to be called once for each object.  This
  522. is to prepare you for the use of virtual functions which we
  523. will study in the next chapter.
  524.  
  525. It will be necessary for you to compile this unit to disk so
  526. it can be used with the last example program in this chapter.
  527.  
  528.  
  529.  
  530.  
  531.                                                     Page 15-9
  532.  
  533.                                 Encapsulation and Inheritance
  534.  
  535. ANOTHER OBJECT IN A UNIT
  536. ____________________________________________________________
  537.  
  538. The example program named CARTRUCK.PAS       ================
  539. continues the new packaging scheme by          CARTRUCK.PAS
  540. including the two descendant object types in ================
  541. its interface after telling the system that
  542. it uses the Vehicles unit.
  543.  
  544. The remainder of this unit is constructed just like the last
  545. one so nothing more needs to be said about it.  Be sure to
  546. compile this unit to disk so it will be available for use with
  547. the next example program.
  548.  
  549. Note that this unit could have been further divided into two
  550. separate units, one for each object type, but it was felt that
  551. it was important to illustrate that several can be combined
  552. in this manner if desired.  In like manner, the last unit
  553. could have been combined with this unit, but once again, it
  554. was desired to illustrate the generality of program
  555. decomposition and packaging.
  556.  
  557.  
  558. USING THE OBJECTS DEFINED IN UNITS
  559. ____________________________________________________________
  560.  
  561. Load the program named INHERIT2.PAS for an   ================
  562. example that uses the units of the last two    INHERIT2.PAS
  563. example programs and is identical to the     ================
  564. program named INHERIT1.PAS.
  565.  
  566. The only difference in these two programs is in the way the
  567. code was packaged.  The second way is much more general and
  568. more conducive to good software engineering practices because
  569. it allows separate development of each of the three program
  570. units.  Each can be refined independently of the other two and
  571. the overall package can be simpler to debug and maintain.  It
  572. should be clear that any changes to the Car object, for
  573. example, will be localized to that single unit and not
  574. scattered all over the software terrain.
  575.  
  576.  
  577. AN ARRAY AND A POINTER
  578. ____________________________________________________________
  579.  
  580. Examine the example program named            ================
  581. INHERIT3.PAS for an example of the use of a    INHERIT3.PAS
  582. pointer to an object and the use of an array ================
  583. of objects.
  584.  
  585. This program is nearly identical to INHERIT2.PAS except for
  586. the addition of an array of Car type objects named Sedan[1]
  587. to Sedan [3], and the definition of a pointer to the Truck
  588. type object named Semi_Point.  Lines 16 and 17 illustrate the
  589.  
  590.                                                    Page 15-10
  591.  
  592.                                 Encapsulation and Inheritance
  593.  
  594. initialization of the array of Sedan, and lines 23 through 26
  595. illustrates its use when the data is printed out.  An object
  596. is dynamically allocated in line 18 and it is then initialized
  597. in the next line.  Its use is illustrated in lines 28 through
  598. 40 and it is deallocated in line 41.
  599.  
  600. TURBO Pascal 5.5 has an extension to the New procedure
  601. allowing the dynamic allocation and the initialization to take
  602. place in the same procedure call.  The line 
  603.  
  604.      New(Semi_Point, Init(1, 25000.0, 18, 5000.0));
  605.  
  606. can be used to replace lines 18 and 19 in this program if you
  607. desire to do so.
  608.  
  609. This program should illustrate that objects can be used with
  610. arrays and pointers just like a record.  Be sure to compile
  611. and execute this program.
  612.  
  613.  
  614.  
  615. WHAT IS MULTIPLE INHERITANCE?
  616. ____________________________________________________________
  617.  
  618. Multiple inheritance allows the programmer to inherit data and
  619. methods from two or more ancestor objects.  When this is done
  620. however, there is a real problem if there are two variables
  621. or methods of the same name and it is up to the programmer to
  622. somehow define which will be used by the descendent.  Some
  623. object oriented programming languages allow multiple
  624. inheritance, but most do not.  TURBO Pascal (version 5.5) has
  625. no provision for multiple inheritance, and Borland has made
  626. no indication at this time whether future versions will allow
  627. it.
  628.  
  629.  
  630.  
  631. WHAT SHOULD YOU DO NOW?
  632. ____________________________________________________________
  633.  
  634. You have reached a major point in your excursion of object
  635. oriented programming, because you now have most of the
  636. knowledge you need to do some serious object oriented
  637. programming.  The best thing for you to do at this point is
  638. stop studying and get busy programming and using some of these
  639. techniques for your projects.  The only topic left is the use
  640. of virtual methods and you can easily defer its use for a long
  641. time.
  642.  
  643. One point should be made before you begin a serious
  644. programming project.  Your first program could have too many
  645. objects and be nearly unreadable unless you strive to use only
  646. a few objects until you gain experience.  Define only a few
  647. objects and write the majority of the program in standard
  648.  
  649.                                                    Page 15-11
  650.  
  651.                                 Encapsulation and Inheritance
  652.  
  653. procedural programming methods.  Add a few more objects to
  654. your next project and as you gain experience, you will feel
  655. very comfortable with the use of objects and your programming
  656. methods will be very clear.
  657.  
  658. Now is the time to begin using this new knowledge but enter
  659. the water slowly the first time.
  660.  
  661.  
  662. PROGRAMMING EXERCISES
  663. ____________________________________________________________
  664.  
  665. 1.   Modify ENCAP2.PAS in such a way to multiply the height
  666.      of the short pole times the length of the medium box and
  667.      print the result out.  Even though this is possible to
  668.      do, it requires you to expend a bit of effort to
  669.      accomplish.  Remember that you should not use the
  670.      components of an object directly, only through use of the
  671.      available methods.
  672.  
  673. 2.   Add an object named Pick_Up to INHERIT2.PAS of type Truck
  674.      and initialize it to some reasonable values.  Print out
  675.      its loading and efficiency in a manner similar to the
  676.      Semi.
  677.  
  678.  
  679.  
  680.  
  681.  
  682.  
  683.  
  684.  
  685.  
  686.  
  687.  
  688.  
  689.  
  690.  
  691.  
  692.  
  693.  
  694.  
  695.  
  696.  
  697.  
  698.  
  699.  
  700.  
  701.  
  702.  
  703.  
  704.  
  705.  
  706.  
  707.  
  708.                                                    Page 15-12
  709.